Idea

Entrar a Agrofy, donde se encuentran los precios pizarra (diferente al oficial, CBOT y MtR) de los principales granos a valor FOB en los principales puertos. El más representativo es el de la bolsa de rosario.

Pasos:

Una vez extraídos los datos, tengo que hacer una media mensua para comparar la variación interanual.

Scrap

setwd("./instalacion selenium r") # Inserir caminho
system("java -jar selenium-server-standalone-4.0.0-alpha-1.jar", wait = FALSE) # Declara selenium
system("chromedriver.exe", wait = FALSE) # Declara chromedriver
library(RSelenium)
library(tidyverse)
library(lubridate)
library(rvest)
library(glue)
library(dplyr) #Para calcular la variación mensual
library(jsonlite)
library(plotly)
link = "https://news.agrofy.com.ar/granos/series-historicas-pizarra"

eCaps <- list(
  chromeOptions = 
    list(prefs = list("profile.default_content_settings.popups" = 0L,
"download.prompt_for_download" = FALSE,
"directory_upgrade" = TRUE,
"download.default_directory" = getwd() %>% str_replace_all("/", "\\\\"))
  )
)


driver <- remoteDriver(remoteServerAddr = "localhost", 
                      browserName = "chrome",
                      extraCapabilities = eCaps) # Inicia o driver

driver$open() # Abre navegador/browser

driver$navigate(link) # Navega pelo link
driver$maxWindowSize() # Maximiza a janela do navegador

Se cierra solo en 6 segundos aprox.

Abrimos el calendario para elegir el inicio del periodo a consultar

Sys.sleep(10)

date_pickers <- driver$findElements(using = 'css',
                                   value = '.react-datepicker__input-container')
since_date_picker <- date_pickers[[1]]
to_date_picker<- date_pickers[[2]] 


since_date_picker$clickElement() #abre datepicker que selecciona inicio de consulta

Ahora tenemos que crear una funcion que, dada una fecha, la elija en el datepicker

auto_datepicker <- function(desde){
  # Elige la fecha automáticamente a partir de lo que pasamos como parámtero
  #primero debemos saber la fecha de hoy y asi saber como nos tenemos que mover ene eldatepicker
  desde <- as.Date(desde)
  hoy <- today()

  dif_de_meses <- length(seq(from=desde, to=hoy, by='month')) - 1
  
  for (n in 1:dif_de_meses){
    #selecciona la flecha de mes
    boton_mes_anterior <- driver$findElement(using = 'css',
                                  value='.react-datepicker__navigation--previous')
    boton_mes_anterior$clickElement()
  }
  dia_uno <- driver$findElement(using = 'css',
                                  value='.react-datepicker__day--001')
  dia_uno$clickElement()
  
}
auto_datepicker('2010-01-01')

Producto, mercado, moneda

producto_mercado_dropdown <- driver$findElements(using = 'css',
                                   value = '.dropdown-heading-value')
producto_dropdown <- producto_mercado_dropdown[[1]]
mercado_dropdown<- producto_mercado_dropdown[[2]] 

producto_dropdown$clickElement()


producto_todos <- driver$findElement(using = 'css', #Un solo elemento
                                   value = '.select-item')
producto_todos$clickElement()

mercado_dropdown$clickElement()
mercado_todos <- driver$findElement(using = 'css', #Un solo elemento
                                   value = '.select-item')
mercado_todos$clickElement()

moneda_dropdown <- driver$findElement(using = 'css',
                                   value = '#currency')
moneda_dropdown$clickElement()

moneda_option <- driver$findElements(using = 'css',
                                   value = '.option')
moneda_option[[2]]$clickElement()

Buscamos.

down <- driver$findElement("css", "body")
down$sendKeysToElement(list(key = "down_arrow"))
down$sendKeysToElement(list(key = "down_arrow"))
buscar <- driver$findElements(using = 'css',
                                   value = '.btn-primary')
buscar[[length(buscar)]]$clickElement()
Sys.sleep(60) #55 en realiad, pero prefiero darle paso
export_csv_button <- driver$findElement(using = 'css',
                                   value = '.csv-export')
export_csv_button$clickElement()
Sys.sleep(5) 

Wrangling

serie <- read.csv("./series-historicas-pizarra.csv", sep = ";")
view(serie)
#Limpiamos los datos
serie$Precio <- serie$Precio %>%
str_sub(5L) %>%
as.numeric()

serie$ï..Fecha <- serie$ï..Fecha %>%
  as.Date(format = "%d-%m-%y")

serie <- rename(serie, Fecha = ï..Fecha)
#Creamos una variable para ver los 
serie <- serie %>%
  group_by(Mercado, Producto)%>%
  mutate(
    Variacion_diaria = (Precio - lag(Precio)) / lag(Precio)
  )

Outliers

# outliers <- serie %>%
#   filter(Precio < outliers_limits(serie)[[2]])%>%
#   summarise(
#     count = n()
#   )
# 
# outliers
ggplot(data = serie) + 
  geom_boxplot(mapping = aes(x = Mercado, y = Precio, fill = Mercado)) + 
  facet_wrap(~ Producto, nrow = 2) +
  theme_light()+
  theme(legend.position="none")

El gráfico presentado revela información clave.

  • No hay datos completos para el Trigo art.12.

  • No todos los mercados presentan datos para todos los productos (o directamente no los comercializan). El de Rosario es el más importante.

  • Los outliers son claros para marcar un límite superior, pero no tanto para el inferior. Se optó por tomar el rango de 45 a 1.000 dólares, descartando el resto.

outliers <- serie %>%
  filter(Precio > 1000 | Precio < 45)
outliers
## # A tibble: 10 x 5
## # Groups:   Mercado, Producto [7]
##    Fecha      Mercado      Producto Precio Variacion_diaria
##    <date>     <chr>        <chr>     <dbl>            <dbl>
##  1 2018-09-19 B.Blanca     Girasol    27.2           -0.895
##  2 2019-05-28 B.Blanca     Girasol    22.6           -0.899
##  3 2020-04-03 B.Blanca     Maiz       16.0           -0.897
##  4 2020-11-03 B.Blanca     Soja     1233.             3.50 
##  5 2018-04-11 Buenos Aires Trigo    2149.             9.08 
##  6 2019-05-28 Quequén     Girasol    22.4           -0.900
##  7 2019-07-17 Quequén     Girasol    24.1           -0.898
##  8 2020-11-03 Quequén     Girasol  1233.             3.35 
##  9 2020-11-20 Quequén     Trigo      12.3           -0.941
## 10 2021-03-25 Rosario      Trigo      21.9           -0.898
serie_mask <- serie %>%
  filter(between(Precio, 45, 1000))
ggplot(data = serie_mask) + 
  geom_boxplot(mapping = aes(x = Mercado, y = Precio, fill = Mercado)) + 
  facet_wrap(~ Producto, nrow = 2) +
  theme_light()+
  theme(legend.position="none")

### Media mensual

serie_mask$mes <- floor_date(serie_mask$Fecha, "month")
serie_mensual <- serie_mask %>%
  group_by(Mercado, Producto, mes) %>%
  summarise(Precio_mensual = mean(Precio))
## `summarise()` has grouped output by 'Mercado', 'Producto'. You can override
## using the `.groups` argument.

Variación interanual de la media mensual

serie_mensual <- serie_mensual %>%
  group_by(Mercado, Producto) %>%
  mutate(
    var_ia = (Precio_mensual - lag(Precio_mensual, 12)) / lag(Precio_mensual, 12))

Por cuestiones de números de datos, se recomienda descartar el “Trigo art. 12”, y todos los mercados, excepto el de rosario.

Presentamos los datos sin los outliers

DT::datatable(serie_mensual,
              class = 'cell-border stripe',
              extensions = 'Buttons',
              options = list(
                dom = 'Bfrtip',
                buttons = c('copy', 'csv', 'excel', 'pdf', 'print')
                ))

Gráficos

Facet grid de los precios de todos los productos para el mercado de rosario.

tabla_grafico <- full_join(
  filter(serie_mensual, Mercado=='Rosario' && Producto == 'Soja'),
  filter(serie_mensual, Mercado=='Rosario' && Producto == 'Trigo'),
  by = "mes"
  )%>%
   full_join(filter(serie_mensual, Mercado=='Rosario' && Producto == 'Maiz'), by='mes')%>%
   full_join(filter(serie_mensual, Mercado=='Rosario' && Producto == 'Girasol'), by ='mes')%>%
   full_join(filter(serie_mensual, Mercado=='Rosario' && Producto == 'Sorgo'),by = 'mes') %>%
  arrange(mes)


plot_ly(tabla_grafico, x = ~tabla_grafico$mes, y = ~tabla_grafico$Precio_mensual.y, name = 'Trigo', type = 'scatter', mode = 'lines', connectgaps = T)%>% 
  add_trace(y = ~tabla_grafico$Precio_mensual.x, name = 'Soja', mode = 'lines', connectgaps = T) %>%
  add_trace(y = ~tabla_grafico$Precio_mensual.y.y, name = 'Girasol', mode = 'lines', connectgaps = T)%>%
  add_trace(y = ~tabla_grafico$Precio_mensual.x.x, name = 'Maiz', mode = 'lines', connectgaps = T) %>%
  add_trace(y = ~tabla_grafico$Precio_mensual, name = 'Sorgo', mode = 'lines', connectgaps = T)%>%
  layout(title = "Precios de los principales granos. Mercado de Rosario.",
         xaxis = list(title = "Fecha"),
         yaxis = list (title = "U$D / ton. Precio de pizarra."))

Exportar Json

write_json(serie_mensual, "./agrofy10años.json")
unlink("series-historicas-pizarra.csv")